package reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

// 通过反射，动态地创建对象
public class Test09 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {

        Class<?> userClass = Class.forName("reflection.User");

        //创建一个对象
        User user = (User) userClass.newInstance();// 本质是调用了无参构造器
        System.out.println(user);

        // 通过构造器创建对象
        Constructor<?> constructor = userClass.getDeclaredConstructor(String.class, Integer.class);
        User user2 = (User)constructor.newInstance("chen", 18);
        System.out.println(user2);

        // 通过反射调用普通方法
        Method setName = userClass.getDeclaredMethod("setName", String.class);
        setName.invoke(user, "大白");// 调用。对象，“方法的值”
        System.out.println(user.getName());

        // 通过反射操作属性
        Field name = userClass.getDeclaredField("age");
        // 没有访问私有属性的权限。关闭程序的安全检测。是的你没看错，true就是关闭
        name.setAccessible(true);
        name.set(user, 20);
        System.out.println(user.getAge());


    }
}
